package memory

import (
	"errors"
	uuid "github.com/satori/go.uuid"
	"session"
	"sync"
)

// 实现 Session_Manager 的接口
// MemorySessionNanager
type MemorySessionNanager struct {
	sessionMap map[string]session.Session // 存放 session 的 map
	rwlock     sync.RWMutex
}

// NewMemorySessionNanager 构造函数
func NewMemorySessionNanager() session.SessionManager {
	return &MemorySessionNanager{
		sessionMap: make(map[string]session.Session, 1024),
	}
}

// Init 实现 Session_Manager 的 Init 接口
func (s *MemorySessionNanager) Init(addr string, option ...interface{}) (err error) {
	return
}

// CreateSession 实现 Session_Manager 的 CreateSession 接口
func (s *MemorySessionNanager) CreateSession() (session session.Session, err error) {
	// 加锁
	s.rwlock.Lock()
	defer s.rwlock.Unlock()
	// 用 uuid 作为 sessionId
	// go get github.com/satori/go.uuid
	uid := uuid.NewV4()
	sessionID := uid.String()
	session = NewMemorySession(sessionID)
	// 放入 sessionMap
	s.sessionMap[sessionID] = session
	return session, err
}

// Get 实现 Session_Manager 的 Get 接口
func (s *MemorySessionNanager) Get(sessionId string) (session session.Session, err error) {
	s.rwlock.Lock()
	defer s.rwlock.Unlock()
	session, ok := s.sessionMap[sessionId]
	if !ok {
		err = errors.New("session not exitts")
		return
	}
	return
}
